/*
 * Esta clase gestiona todo lo relacionado con la conexión, ejecución,
 * desconexión y propiedades de la base de datos utilizada.
 * Además, permite gestionar integralmente los mensajes del sistema
 * en los diferentes lenguajes que se hayan configurado.
 * 
 * Por otra parte, esta es una clase de tipo Session, lo que quiere decir
 * que almacena los datos requeridos por la aplicación mientra
 * dure la sesión del usuario logeado
 * 
 */
package system;

import java.sql.*;
import java.util.ResourceBundle;
import javax.naming.NamingException;

/**
 *
 * @author emojica
 */
public class Persistencia {

    /*
     * DataBaseInformation
     */
    public static Connection conn = null;
    private static Statement stmt = null;
    private static ResultSet rsts = null;
    private static String dbUsr = "";
    private static String dbPass = "";
    private static String dbName = "";
    private static String dbUrl = "";
    private static String dbDriver = "";

    /**
     * Creates a new instance of DbConnection
     */
    public Persistencia() {
    }


    /*
     * Carga los datos de la conexion con la base de datos
     */
    private void loadProperties() throws Exc, SQLException, NamingException, Exception {
        Cryptography crypto = new Cryptography();
        ResourceBundle rb = ResourceBundle.getBundle("system.db");
        dbUsr = crypto.decryption(rb.getString("usr"));
        dbPass = crypto.decryption(rb.getString("pass"));
        dbName = rb.getString("dbname");
        dbUrl = rb.getString("url").trim();
        dbDriver = rb.getString("driver").trim();
    }

    //Conecta con la base de datos
    public void dbConnect() throws Exc, SQLException, NamingException, Exception {
        //Carga las propiedades de la conexión de la base de datos
        loadProperties();

        if (conn != null && !conn.isClosed()) {
            return;
        }
        Class.forName(dbDriver);
        conn = DriverManager.getConnection(dbUrl, dbUsr, dbPass);

    }

    //Desconecta la base de datos
    public void dbDisconnect() throws Exc, SQLException, NamingException, Exception {
        //Si conn es distinto de null y no esta cerrado
        if (conn != null && !conn.isClosed()) {
            if (rsts != null) {
                rsts.close();
                rsts = null;
            }
            if (stmt != null) {
                stmt.close();
                stmt = null;
            }
            conn.close();
            conn = null;
        }
    }

    /*
     * Ejecuta una sentencia SQL y devuelve un Resulset Utilizado para crear
     * listas de datos
     */
    public ResultSet executeRsts(String sql) throws Exc, SQLException, NamingException, Exception {
        stmt = null;
        dbConnect();
        stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        return stmt.executeQuery(sql);
    }

    /*
     * Método que ejecuta una sentencia sql Utilizado para INSERT, DELETE Y
     * UPDATE
     */
    public void executeUpdate(String sql) throws Exc, SQLException, NamingException, Exception {
        stmt = null;
        dbConnect();
        stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

        //Ejecuta el sql
        stmt.executeUpdate(sql);

        dbDisconnect();
    }

    public Connection getConn() {
        return conn;
    }
}